package cn.lccabc.array.no0697;

import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

/**
 * @program: leet-code
 * @description: 数组的度
 * 给定一个非空且只包含非负数的整数数组 nums, 数组的度的定义是指数组里任一元素出现频数的最大值。
 *
 * 你的任务是找到与 nums 拥有相同大小的度的最短连续子数组，返回其长度。
 *
 * 示例 1:
 *
 * 输入: [1, 2, 2, 3, 1]
 * 输出: 2
 * 解释:
 * 输入数组的度是2，因为元素1和2的出现频数最大，均为2.
 * 连续子数组里面拥有相同度的有如下所示:
 * [1, 2, 2, 3, 1], [1, 2, 2, 3], [2, 2, 3, 1], [1, 2, 2], [2, 2, 3], [2, 2]
 * 最短连续子数组[2, 2]的长度为2，所以返回2.
 * 示例 2:
 *
 * 输入: [1,2,2,3,1,4,2]
 * 输出: 6
 * 注意:
 *
 * nums.length 在1到50,000区间范围内。
 * nums[i] 是一个在0到49,999范围内的整数。
 * @author: LiCC
 * @create: 2020-01-05 10:49
 */
public class Solution {
    public static int findShortestSubArray(int[] nums) {
        Map<Integer, Integer> left = new HashMap<>(), right = new HashMap<>(),
        count = new HashMap<>();
        for (int i = 0; i < nums.length; i++){
            int num = nums[i];
            if (!left.containsKey(num)) left.put(num, i);
            right.put(num, i);
            count.put(num, count.getOrDefault(num, 0) + 1);
        }
        int valueMax = Collections.max(count.values()), min = nums.length;
        for (Map.Entry<Integer, Integer> entry : count.entrySet()){
            if (entry.getValue().equals(valueMax)){
                min = Math.min(right.get(entry.getKey()) - left.get(entry.getKey()), min);
            }
        }
        return min + 1;
    }

    public static void main(String[] args) {
        int[] nums = new int[]{1,2,2,3,1,4,2};
        int len = findShortestSubArray(nums);
        System.out.println(len);
    }
}
